#! /bin/bash
<<!
描述:
    1.该脚本用来安装git服务端,该脚本选择通过编译git源码的形式来进行安装,目的是为了能够使用最新版本的
      git服务器.
    2.项目在安装过程中在针对git安装目录的时候需要用户自己选择目录,同时设置了较长的的等待时间(20S).
    3.git源码编译依赖较多的组件[curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMake package cpio perl  expect].
    4.默认将文件下载到当前目录下,在安装完成后会删除下载的包,但是不会删除编译后的文件.
    5.关于gitois的安装描述可以参考:https://github.com/res0nat0r/gitosis
    6.关于git安装的描述可以参考:https://github.com/git/git/blob/master/INSTALL
    7.如果启动sshd报错:Failed to start OpenSSH server daemon
    /var/empty/sshd must be owned by root and not group or world-writable.
    可以执行[chown -R root.root /var/empty/sshd;chmod 744 /var/empty/sshd;systemctl start sshd]
作者:panda
联系方式:jpanda@aliyun.com
时间:2018年04月25日
!

#======================================================
#=======================================================
#============   参数定义   =============================
#=======================================================
shellPath=$(cd `dirname $0`; pwd); 			                      		#Shell脚本所在目录
currentpath=$(pwd);						                               	#当前执行脚本所在目录
gitName=git							                                  	#git软件名称
gitVersion=-2.9.5						                             	#git版本
gitSuffix=.tar.gz						                             	#git安装包后缀
gitBaseUri=https://mirrors.edge.kernel.org/pub/software/scm/git/        #git下载地址
gitServerUrl=$gitBaseUri$gitName$gitVersion$gitSuffix	          		#完整的git server下载地址
gitInstallDir=/usr/local/git					                       	#git server 安装目录
defauleGitRepoDir=/home/git/repositories			                 	#默认的git仓库地址
defaultGitRepoName=jpanda.git					                      	#默认的git仓库名称
installDir=/usr/local/git                                               #编译安装目录
#=================================================
#========         日志脚本引用代码         ==========
#=================================================
logshExist=$(`ls ./log.sh &>/dev/null`; echo $?);			            #日志脚本文件是否存在
downLoaded=0;								                            #是否下载过脚本文件,如果下载过,无论成功失败都不会再次下载.
if [ $logshExist -gt 0 -a  $downLoaded -eq 0 ]
  then
    wget -Ncq http://gitee.com/topanda/note/raw/master/linux/log.sh &>/dev/null;		#下载日志脚本
    downLoaded=1;							                            #重置下载标记
fi
chmod u+x log.sh							                            #修改日志脚本执行权限
logshExist=$(`ls ./log.sh &>/dev/null`; echo $?);
function log(){								                            #如果不存在日志文件,默认什么都不做.
  if [  $logshExist -eq 0 ]
    then
    logPath=$shellPath/log.sh
    $logPath $*;
  fi
}
#================================================
#================================================
#=========    错误日志监听方法    ===============

function listionErr(){
while read line;do log WARN $line;done;
}
#================================================

#==========   日志脚本引用代码 END   ===============
#================================================
#================================================
#============== 安装git server服务   =============
#================================================
#安装依赖
log INFO " 检查安装必要的依赖...";
log INFO "安装git服务的过程中将会添加以下依赖."
log INFO "依赖包集合:curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMake package cpio perl  expect"
log INFO "\033[32;05m 执行检查安装操作...\033[0m"
yum -y -q install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMake package cpio perl  expect | listionErr
log INFO "安装perl-ExtUtils-MakeMaker package..."
yum -y -q install perl-ExtUtils-MakeMaker package. | listionErr
log INFO  "\033[32;05m 下载git server文件中,下载地址为:$gitServerUrl \033[0m ";
wget  -Ncq $gitServerUrl;
log INFO "解压压缩文件:$gitName$gitVersion$gitSuffix"
tar -zxf $gitName$gitVersion$gitSuffix;
log INFO "进入$gitName$gitVersion目录下..."
cd  $gitName$gitVersion;
log INFO "编译git服务.执行命令: \033[31;05m make prefix=$installDir all \033[0m"
make -s prefix=$installDir all 1>/dev/null | listionErr
log INFO "编译git服务.执行命令: \033[31;05m make prefix=$installDir install  \033[0m"
make -s prefix=$installDir install 1>/dev/null | listionErr
log INFO "备份/etc/profile文件,备份文件名称为/etc/profile.before.git.cp."
cp /etc/profile /etc/profile.before.git.cp
#添加GIT环境变量
log INFO "建立软链接:ln -s $installDir/bin    /usr/local/bin/git"
ln -s $installDir/bin    /usr/local/bin/git
log INFO "进入$basepath目录下..."
cd $basepath;
log INFO "移除下载包...";
rm -rf $currentpath$gitName$gitVersion$gitSuffix;
log INFO "创建git用户组:git."
groupadd git
log INFO "创建git用户:git."
#adduser  --system  --shell /bin/sh --gecos 'git version control' --group --disabled-password --home /home/git  git
useradd   -c 'git version control'  -d /home/git  -g git git
log INFO "初始化git仓库..."
#初始化git仓库
#read -t 20 -p "请输入git仓库地址(默认安装在/home/git/repositories下)[20s]:" gitRepoDir
log INFO "git仓库地址(默认安装在/home/git/repositories下)";
gitRepoDir=${gitRepoDir:-/home/git/repositories}
#read -t 20 -p "请输入仓库名称(默认为jpanda.git)[20s]:" gitRepoName
log INFO "仓库名称(默认为jpanda.git)"
gitRepoName=${gitRepoName:-jpanda.git}
ls $gitRepoDir 2>/dev/null  1>/dev/null || mkdir -p $gitRepoDir && log INFO "创建了新的目录:$gitRepoDir";
log INFO "进入$gitRepoDir目录下..."
cd $gitRepoDir
ls $gitRepoName 2>/dev/null  1>/dev/null || mkdir -p $gitRepoName && log INFO "创建了git仓库目录:$gitRepoName"
log INFO "初始化裸仓库..."
cd $gitRepoName
git init --bare | listionErr
log INFO "修改git仓库权限."
chown -R git:git /home/git
#=====================================
#=== SSH免密码验证链接 ===============
#=====================================

#echo "SSH免密码登录验证调整"
#su git<<EOF
#cd /home/git
#mkdir .ssh && chmod 700 .ssh
#touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys
#cd .ssh
#ssh-keygen -C "admin@localhost.com" -t rsa -b 2048

#logout
#EOF
#修改git用户不能登录
#echo "修改git用户不能登录!"
#sed -in  '/git:/{s/\/bin\/bash/\/sbin\/nologin/g}' /etc/passwd
log INFO "启用sshd和守护线程"
#启用sshd和守护线程
cp -r  $currentpath/git-2.9.5/contrib/git-shell-commands/* /home/git/
cp /usr/local/git/libexec/git-core/git-daemon /etc/init.d/git-daemon
log INFO "启动git服务"
/etc/init.d/git-daemon restart &
if [ 0 -eq $? ]
  then log INFO "git-daemon服务启动成功...";
fi

#修改sshd文件所属者
chown -R root.root /var/empty/sshd;chmod 744 /var/empty/sshd;
#重启sshd服务
systemctl status sshd
if [ 0 -eq $? ]
  then
    log INFO "重启系统服务..."
    systemctl restart sshd
else
    log INFO "启动系统服务..."
    systemctl start sshd
fi

systemctl status sshd
log INFO "sshd服务启动状态 $?"
if [ 0 -lt $? ]
  then log ERR "sshd服务启动失败,请手动检查."
fi
# 执行到这儿,git服务安装完成,解析来安装gitosis.
log INFO "git安装完成..."
log INFO "当前脚本所有默认参数:"
log INFO "日志文件:logFile=$logFile"
log INFO "脚本所在目录:shellPath=$shellPath"
log INFO "当前执行脚本所在目录:currentpath=$currentpath"
log INFO "git软件名称:gitName=$gitName"
log INFO "git版本:gitVersion=$gitVersion"
log INFO "git安装包后缀:gitSuffix=$gitSuffix"
log INFO "git下载地址:gitBaseUri=$gitBaseUri"
log INFO "完整的git server下载地址:gitServerUrl=$gitServerUrl"
log INFO "git server 安装目录:gitInstallDir=$gitInstallDir"
log INFO "默认的git仓库地址:defauleGitRepoDir=$defauleGitRepoDir"
log INFO "默认的git仓库名称:defaultGitRepoName=$defaultGitRepoName"

log WARN "1.脚本会在当前目录下下载log.sh文件,该文件用来打印SHELL脚本中的日志,脚本结束后不会删除该依赖."
log WARN "2.脚本在执行完毕后,会删除掉git的压缩包,但是会保留编译后的二进制文件."
log WARN "5.其余参数请参考当前脚本所有默认参数."
